lucky

lucky

跟着好奇心,去探索我觉得酷的东西 希望以电子报分享所见所思的方式,结识更多朋友,碰撞出更多思维火花
github
bilibili
twitter
medium
youtube
zhihu
mastodon
follow
substack

GORM API 完全指南:解鎖 Go 語言資料庫操作的終極武器!

image
在 Go 語言開發中,資料庫操作是每個開發者都無法繞開的話題。而 GORM 作為一款功能強大、設計優雅的 ORM 庫,憑藉其簡潔的 API 和豐富的功能,成為了 Go 開發者的首選工具。無論你是新手還是老手,掌握 GORM 的 API 都能讓你的開發效率提升數倍!

今天,我們將深入探討 GORM 的所有核心 API,帶你從入門到精通,徹底掌握 GORM 的奧秘!

為什麼選擇 GORM?#

GORM 不僅僅是一個 ORM 工具,它更像是一個資料庫操作的瑞士軍刀。以下是 GORM 的核心優勢:

  • 簡潔的 API 設計:鏈式調用,代碼清晰易讀。
  • 強大的功能支持:支持 CRUD、事務、鉤子、預加載等高級功能。
  • 多資料庫支持:MySQL、PostgreSQL、SQLite、SQL Server 等主流資料庫。
  • 活躍的社區:豐富的文檔和社區支持,問題解決速度快。

接下來,我們將從 初始化、模型定義、CRUD 操作、高級功能 四個方面,全面解析 GORM 的 API!

1. 初始化與配置#

1.1 連接資料庫#

GORM 支持多種資料庫,以下是連接 MySQL 的示例:

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

func main() {
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
    fmt.Println("Database connected!")
}

1.2 配置 GORM#

GORM 提供了豐富的配置選項,例如日誌級別、表前綴等:

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
    Logger: logger.Default.LogMode(logger.Info), // 設置日誌級別
    NamingStrategy: schema.NamingStrategy{
        TablePrefix: "t_", // 表前綴
    },
})

2. 模型定義#

2.1 定義模型#

GORM 使用構造體來定義模型,每個字段可以通過標籤(Tag)指定資料庫約束:

type User struct {
    gorm.Model        // 內嵌 gorm.Model,包含 ID、CreatedAt、UpdatedAt、DeletedAt
    Name       string `gorm:"type:varchar(100);not null"`
    Age        int    `gorm:"default:18"`
    Email      string `gorm:"uniqueIndex"`
}

2.2 自動遷移#

GORM 可以根據模型自動創建或更新表結構:

db.AutoMigrate(&User{}) // 自動創建 users 表

3. CRUD 操作#

3.1 創建記錄#

// 創建單條記錄
user := User{Name: "John", Age: 20}
result := db.Create(&user) // 返回 *gorm.DB
fmt.Println(user.ID)       // 獲取插入的主鍵

// 批量創建
users := []User{{Name: "Alice"}, {Name: "Bob"}}
db.Create(&users)

3.2 查詢記錄#

// 查詢單條記錄
var user User
db.First(&user, 1)          // 根據主鍵查詢
db.First(&user, "name = ?", "John") // 條件查詢

// 查詢多條記錄
var users []User
db.Find(&users)             // 查詢所有記錄
db.Where("age > ?", 18).Find(&users) // 條件查詢

// 查詢特定字段
db.Select("name", "age").Find(&users)

// 排序和分頁
db.Order("age desc").Limit(10).Offset(0).Find(&users)

3.3 更新記錄#

// 更新單條記錄
db.Model(&user).Update("Age", 21)

// 更新多個字段
db.Model(&user).Updates(User{Name: "Alice", Age: 22})

// 批量更新
db.Model(&User{}).Where("age < ?", 18).Update("age", 20)

3.4 刪除記錄#

// 刪除單條記錄
db.Delete(&user)

// 根據主鍵刪除
db.Delete(&User{}, 1)

// 批量刪除
db.Where("age < ?", 18).Delete(&User{})

4. 高級功能#

4.1 事務處理#

GORM 支持手動和自動事務:

// 手動事務
tx := db.Begin()
if err := tx.Create(&User{Name: "John"}).Error; err != nil {
    tx.Rollback()
    return
}
tx.Commit()

// 自動事務
db.Transaction(func(tx *gorm.DB) error {
    if err := tx.Create(&User{Name: "John"}).Error; err != nil {
        return err
    }
    return nil
})

4.2 鉤子函數#

GORM 提供了模型生命週期鉤子,可以在特定時間點執行自定義邏輯:

func (u *User) BeforeCreate(tx *gorm.DB) error {
    u.CreatedAt = time.Now()
    return nil
}

func (u *User) AfterDelete(tx *gorm.DB) error {
    fmt.Println("User deleted:", u.ID)
    return nil
}

4.3 預加載(解決 N+1 查詢問題)#

type Order struct {
    gorm.Model
    UserID uint
    User   User
}

var orders []Order
db.Preload("User").Find(&orders) // 預加載關聯的 User 資料

4.4 原生 SQL#

GORM 支持執行原生 SQL 語句:

var users []User
db.Raw("SELECT * FROM users WHERE age > ?", 18).Scan(&users)

db.Exec("UPDATE users SET age = ? WHERE name = ?", 20, "John")

5. 關聯關係#

5.1 一對一#

type Profile struct {
    gorm.Model
    UserID uint
    User   User
}

type User struct {
    gorm.Model
    Profile Profile
}

5.2 一對多#

type Order struct {
    gorm.Model
    UserID uint
    User   User
}

type User struct {
    gorm.Model
    Orders []Order
}

5.3 多對多#

type User struct {
    gorm.Model
    Languages []Language `gorm:"many2many:user_languages;"`
}

type Language struct {
    gorm.Model
    Name  string
    Users []User `gorm:"many2many:user_languages;"`
}

6. 其他功能#

6.1 軟刪除#

GORM 支持軟刪除,記錄不會被真正刪除,而是設置 DeletedAt 字段:

db.Delete(&user) // 軟刪除
db.Unscoped().Delete(&user) // 硬刪除

6.2 自定義表名#

func (User) TableName() string {
    return "custom_users"
}

總結#

GORM 的 API 設計簡潔而強大,覆蓋了資料庫操作的方方面面。無論是簡單的 CRUD 操作,還是複雜的關聯查詢和事務處理,GORM 都能輕鬆應對。通過熟練掌握這些 API,你可以大幅提升開發效率,寫出更優雅、更高效的 Go 代碼。

如果你對某個功能有更深入的需求,可以參考 GORM 官方文檔 獲取更多詳細信息。希望這篇指南能幫助你徹底掌握 GORM,成為資料庫操作的終極高手!

立即嘗試 GORM,讓你的 Go 語言開發飛起來! 🚀

歡迎關注我的公眾號 “全棧開發 ck”,原創技術文章第一時間推送。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。